import webpack from 'webpack';
import { createConfig } from './config.js';
import { handleBuildComplete, setupMiniUIResources, parseArgs, setupDynamicEntry, setupPHPResources } from './utils.js';
import { fileURLToPath } from 'url';
import path from 'path';

const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);

/**
 * 执行 Webpack 构建操作，支持开发模式的监听和生产模式的一次性构建。
 * 根据命令行参数决定启动监听模式还是进行一次性构建。
 * 在监听模式下，会监控文件变化并自动重新构建，同时支持动态入口监控和优雅退出。
 */
export function build() {
    // 解析命令行参数
    const options = parseArgs();
    // 根据是否监听模式创建 Webpack 配置
    const config = createConfig(options.watch);

    // 设置 MiniUI 资源
    setupMiniUIResources(config);
    setupPHPResources(config);
    // 创建 Webpack 编译器实例
    const compiler = webpack(config)!;

    if (options.watch) {
        // 输出进入开发监听模式的提示信息
        console.log('Starting webpack in watch mode (development)...');
        // 启动 Webpack 监听模式，构建完成后调用 handleBuildComplete 处理结果
        const watching = compiler.watch({ ...compiler.options.watchOptions }, handleBuildComplete)!;

        // 添加动态入口监控
        setupDynamicEntry(compiler, watching);

        // 监听 SIGINT 信号（如 Ctrl+C），实现优雅停止监听模式
        process.on('SIGINT', () => {
            console.log('\nStopping webpack watch mode...');
            watching.close(() => {
                console.log('Webpack watch mode stopped.');
                process.exit(0);
            });
        });
    } else {
        // 输出开始生产构建的提示信息
        console.log('Starting webpack build (production)...');
        // 执行一次性的 Webpack 生产构建
        compiler.run((err, stats) => {
            // 处理构建完成的结果
            handleBuildComplete(err, stats);
            // 构建完成后关闭编译器
            compiler.close((closeErr) => {
                if (closeErr) {
                    console.error('Failed to close webpack compiler:', closeErr);
                }
            });
        });
    }
}

// 执行构建函数
build();